package pers.wensheng.patterns.behavioral_pattern.strategy_pattern.advanced;

import pers.wensheng.patterns.behavioral_pattern.strategy_pattern.advanced.entity.PayStrategy;
import pers.wensheng.patterns.behavioral_pattern.strategy_pattern.advanced.entity.WXPay;
import pers.wensheng.patterns.behavioral_pattern.strategy_pattern.advanced.entity.ZFBPay;
import pers.wensheng.patterns.behavioral_pattern.strategy_pattern.advanced.enums.PayEnum;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 支付上下文
 */
public class PayContext {


    //核心：Spring环境中可以在List上面加上@Autowird注解，会自动注入PayStrategy接口的子实现类对象，就完全解耦了，就不用下面的代码块了
    //@Autowird
    private final List<PayStrategy> payStrategies = new ArrayList<>();

    {
        payStrategies.add(new WXPay());
        payStrategies.add(new ZFBPay());
    }

    /**
     * 定义一个map
     * 通过支付类型可以找到支付方式的实现类
     */
    private final Map<PayEnum,PayStrategy> map = new HashMap<>();

    {
        payStrategies.forEach(payStrategy -> map.put(payStrategy.type(),payStrategy));
    }

    /**
     * 对外暴露支付接口
     * @param type
     * @param money
     */
    public void pay(PayEnum type,Integer money){
        PayStrategy payStrategy = map.get(type);
        if (payStrategy == null){
            return;
        }
        payStrategy.pay(money);

    }

}
